wpt_tmp->latitude = lat;
wpt_tmp->longitude = -lon;
if ( control ) {
- int addrlen = le_read16((short *)
- (((char *)record)+18));
- int cmtlen = le_read16((short *)
- (((char *)record)+20+addrlen));
- wpt_tmp->notes = (char *)xmalloc(cmtlen+1);
- wpt_tmp->shortname = (char *)xmalloc(addrlen+1);
- wpt_tmp->notes[cmtlen] = '\0';
+ int obase, addrlen, cmtlen;
+
+ /* Somewhere around TopoUSA 6.0, these moved */
+ /* This block also seems to get miscompiled
+ * at -O0 on Linux. I tried rewriting it to
+ * reduce/eliminate some of the really funky
+ * pointer math and casting that was here.
+ */
+ if (version >= 11) {
+ obase = 20;
+ } else {
+ obase = 18;
+ }
+
+ addrlen = le_read16(&record[obase]);
+ cmtlen = le_read16(&record[obase+2+addrlen]);
+
+ wpt_tmp->shortname = xmalloc(addrlen+1);
wpt_tmp->shortname[addrlen]='\0';
+ wpt_tmp->notes = xmalloc(cmtlen+1);
+ wpt_tmp->notes[cmtlen] = '\0';
memcpy(wpt_tmp->notes,
- ((char *)record)+22+addrlen,
+ record+obase+4+addrlen,
cmtlen );
memcpy(wpt_tmp->shortname,
- ((char *)record)+20,
+ record+obase+2,
addrlen );
}
else {
- wpt_tmp->shortname = (char *) xmalloc(7);
+ wpt_tmp->shortname = xmalloc(7);
sprintf( wpt_tmp->shortname, "\\%5.5x", serial++ );
}
if ( control == 2 ) {